#ifndef __IVS_MOVE_H__
#define __IVS_MOVE_H__

#ifdef __cplusplus
#if __cplusplus
extern "C"
{
#endif
#endif /* __cplusplus */

#include <imp/imp_ivs_base_move.h>

/*
 * move 算法的句柄
 */
typedef struct {
	int index_read;
	int index_write;
	IMP_IVS_BaseMoveOutput *result;
} ivs_move_sem_t;

typedef struct {
    int index;           /**< the counter for frames */
    void* ivs_move;
    IMP_IVS_BaseMoveParam param;  /**< 输入数据 */
    ivs_move_sem_t *movesem;  /**< 输出数据 */
    int (*free_data)(void *data); /**< 释放帧的回调函数 */
} ivs_move_t;

/*
 * @fn ivs_move_t* imp_alloc_move(IMP_IVS_BaseMoveParam* param, int (*free_data)(void *data));
 *
 * 初始化move算法
 *
 * @param[in] param move 算法的输入结构体
 * @param[in] param free_data 释放由imp_move_process输入的帧
 *
 * @return move 算法的句柄
 *
 * @retval NULL 失败
 * @retval 非NULL 成功
 *
 * @remark 无
 *
 * @attention 无
 */

ivs_move_t* imp_alloc_base_move(IMP_IVS_BaseMoveParam* param, int (*free_data)(void *data));

/*
 * @fn void imp_free_move(ivs_move_t *move);
 *
 * 注销move算法
 *
 * @param[in] param move 算法的句柄
 *
 * @remark 无
 *
 * @attention 无
 */

void imp_free_base_move(ivs_move_t *move);

/*
 * @fn int imp_move_preprocess(ivs_move_t *move, IMPFrameInfo *frame);
 *
 * 预处理move算法
 *
 * @param[in] param move算法的句柄
 *
 * @param[in] frame 输入帧信息
 *
 * @retval 非0 失败
 * @retval 0 成功
 *
 * @remark 无
 *
 * @attention 无
 */
int imp_base_move_preprocess(ivs_move_t *move, IMPFrameInfo *frame);

/*
 * @fn int imp_move_process(ivs_move_t *move, IMPFrameInfo *frame, IMP_IVS_BaseMoveOutput *result);
 *
 * 运行move算法
 *
 * @param[in] param move算法的句柄
 *
 * @param[in] frame 输入帧信息
 *
 * @param[out] result move算法处理结果
 *
 * @retval 非0 失败
 * @retval 0 成功
 *
 * @remark 无
 *
 * @attention 无
 */
int imp_base_move_process(ivs_move_t *move, IMPFrameInfo *frame, IMP_IVS_BaseMoveOutput *result);

/*
 * @fn int imp_get_move_param(ivs_move_t *move, IMP_IVS_BaseMoveParam *param);
 *
 * 获取移动侦测的参数
 *
 * @param[in] move move 算法的句柄
 * @param[in] param move 算法的输入结构体
 *
 * @retval 非0 失败
 * @retval 0 成功
 *
 * @remark 无
 *
 * @attention 无
 */
int imp_get_base_move_param(ivs_move_t *move, IMP_IVS_BaseMoveParam *param);

/*
 * @fn int imp_set_move_param(ivs_move_t *move, IMP_IVS_BaseMoveParam *param);
 *
 * 设置移动侦测的参数
 *
 * @param[in] move move 算法的句柄
 * @param[in] param move 算法的输入结构体
 *
 * @retval 非0 失败
 * @retval 0 成功
 *
 * @remark 无
 *
 * @attention 无
 */
int imp_set_base_move_param(ivs_move_t *move, IMP_IVS_BaseMoveParam *param);

/*
 * @fn int imp_flush_frame(ivs_move_t *move);
 *
 * 释放由外部通过ProcessAsync输入给移动侦测后被缓存的所有frame
 *
 * @param[in] move move 算法的句柄
 *
 * @remark 无
 *
 * @attention 无
 */
int imp_base_flush_frame(ivs_move_t *move);

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#endif /* __IVS_MOVE_H__ */
